﻿using Blog.Model;
using Blog.Utility._MD5;
using Blog.Utility.ApiResult;
using IBaseService;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace Blog.Controllers
{
	[Route("api/[controller]")]
	[ApiController]
	public class LoginController : ControllerBase
	{
		private readonly IAuthorService _authorService;

		public LoginController(IAuthorService authorService)
		{
			_authorService = authorService;
		}

		//该C#代码的功能是创建一个JWT（JSON Web Token）并返回给客户端。
		[HttpPost("Login")]
		public async Task<ApiResult> Login(string userName,string password) {
			string pwd = _MD5.MD5Encrypt32(password);
			List<Author> authors = await _authorService.QueryAsync();
			Author author =  authors.Where(x => x.UserName == userName && x.Password == pwd).FirstOrDefault();
			if (author == null) return ApiResultTool.Fail("账户名或密码错误！"); 
			 
			//创建Claim数组：从user对象中提取Id、Name和UserName信息，将其封装进一个Claim数组claims中。这些信息将在JWT中作为载荷传输。
			var claims = new Claim[] {
				new Claim("Id",author.Id.ToString()),
				new Claim(ClaimTypes.Name,author.Name),
				new Claim("UserName",author.UserName),
			};
			//生成密钥：使用一个固定字符串"aBcD1234567890abCDefGHiJklMNOpQrStUvWxYz0987654321"并采用UTF8编码生成一个对称加密密钥key，用于签名JWT以确保其完整性。
			var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("aBcD1234567890abCDefGHiJklMNOpQrStUvWxYz0987654321"));
			//创建JwtSecurityToken：
			var token = new JwtSecurityToken(
				issuer: "http://localhost/6060",
				audience: "http://localhost:7257",
				claims: claims,
				notBefore: DateTime.Now,
				expires: DateTime.Now.AddHours(1),
				signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
			);
			//指定发行者(issuer)和受众(audience)，但此处被设为空字符串，应根据实际情况配置。
			//将之前创建的claims数组关联到JWT中，使其携带用户相关数据。
			//设置JWT生效时间(notBefore)为当前时间，表示在此之前JWT无效。
			//设置JWT过期时间(expires)为当前时间加1小时，即1小时后JWT失效。
			//使用SigningCredentials对象指定签名算法（HMAC SHA256）和密钥key对JWT进行签名，以确保其在传输过程中的安全性和防篡改。
			//生成JWT字符串：利用JwtSecurityTokenHandler将JwtSecurityToken对象序列化为JWT字符串jwtToken。
			//返回成功结果：最后，调用ApiResultTool.Success(jwtToken)方法，将生成的JWT字符串作为成功响应返回给客户端，通常用于身份验证和授权目的。

			var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
			return ApiResultTool.Success(jwtToken);

			
		}
	}
}
